0x00 前言
在内网渗透的信息收集中,机器服务探测一般都是通过端口扫描去做的,但是有些环境不允许这些操作。通过利用 SPN 扫描可快速定位开启了关键服务的机器,这样就不需要去扫对应服务的端口,有效规避端口扫描动作。
Kerberoasting
是域渗透中经常使用的一项技术,是通过爆破 TGS-REP
实现。
0x01 关于 SPN
服务主体名称(SPN: Service Principal Names
)是服务实例,可以将其理解为一个服务(比如 HTTP、MSSQL)的唯一标识符,服务在加入域中时是自动注册的。
如果在整个林或域中的计算机上安装多个服务实例,则每个实例都必须具有自己的 SPN
。如果客户端可能使用多个名称进行身份验证,则给定服务实例可以具有多个 SPN
。SPN
始终包含运行服务实例的主机的名称,因此服务实例可以为其主机名称或别名注册 SPN
。
如果用一句话来说明的话就是如果想使用 Kerberos
协议来认证服务,那么必须正确配置 SPN
。
SPN 可以分为两种:
- 注册在域内机器账户(
Computers
)上 - 注册在域内用户账户(
Users
)下
0x02 SPN
标准格式
在 SPN 语法中存在 4 种元素,两个必须元素和两个格外元素。其中 <service class>
和 <host>
为必需元素。
1 | <service class>/<host>:<port> <servername> |
0x03 使用 SetSPN
为机器(域用户)创建 SPN
命令语法类似如下:
1 | Setspn -S http/<computername>.<domainname> <domain-user-account> |
-S
参数:验证不存在重复项后,添加随意 SPN
。注意: -S
从 Windows Server 2008
开始系统默认提供。
此处以 Web 服务器为例。
- 以
web 用户
运行Web 服务器
- 域管理员权限运行
cmd
1 | Setspn -s http/WebDemo_PC.rcoil.me rcoil\web |
结果如下:
0x04 借助 SetSPN
对域内相关服务进行查询
4.1、查询域内 MSSQL
数据库服务器
使用第 3 点中的对照表快速查询
1 | setspn -T rcoil.me -Q */* | findstr "MSSQLSvc" |
4.2、相关查询 C# 源码
1 | using System; |
自行添加需要的服务即可,更多的服务写在了备注中。
4.3、相关原理说明
在 SPN 扫描时我们可以直接通过脚本,或者命令去获悉内网已经注册的 SPN 内容
LDAP 协议
全称是 Lightweight Directory Access Protocol
,一般翻译都是翻译成 轻量目录访问协议。通俗点可以把 LDAP 协议
理解为一个关系型数据库,其中存储了域内主机的各种配置信息。
在域控中默认安装有 ADSI 编辑器
,它是 LDAP
的编辑器,可以通过在域控中运行 adsiedit.msc
来打开。
我们的 SPN 查询
,实际上就是就是查询 LDAP
中存储的内容。(以后会通过别的章节详细介绍 LDAP 协议
)
下图是 4.2
中 MSSQL 查询
的结果,协议为 LDAP
。
4.4、更多扫描工具
扫描工具有很多,但是只要知道原理就不会觉得太难。
1 | Discover-PAMSSQLServers(Powershell-AD-Recon) |
0x05 获取当前目标域中所有以域用户身份起服务的 SPN
查询以域用户身份起的服务,主要是为了后续 Kerberoast
做准备。
- 现成工具
1 | cscript.exe GetUserSPNs.vbs |
C# 代码
(其实就是查询LDAP):
1 | public static void GetUserSPN(string RootDSE) |
结果如下:
0x06 Kerberoast (Kerberos TGS服务票据(Service Ticket)离线爆破)
6.1、申请 TGS
powershell
1 | PS>Add-Type -AssemblyName System.IdentityModel |
C#
1 | public KerberosRequestorSecurityToken (string servicePrincipalName); |
这一整个过程是通过 AS-REQ、AS-REP、TGS-REQ、TGS-REP
这四个认证流程,最终获取到 RC4方式的加密票据。
6.2、获取 TGS-REP
Kerberos 协议
中请求的票据会保存在内存中,可以通过 klist
命令查看当前会话存储的 kerberos
票据。
使用
mimikatz
的kerberos::list /export
导出。SharpRost
(如今的Rubeus)Invoke-kerberoast
的-outputformat
,选择 hashcat 格式。综合以上代码,新建项目,项目地址: SPNSearcher
6.3、爆破 TGS-REP
此处爆破的是HTTP/WebDemo_PC.rcoil.me
可选择工具(工具始终是工具,看的是字典强不强):1
2tgsrepcrack.py(kerberoast套装)
hashcat(密码破解全能工具,kali自带)
0x07 Kerberoasting
的后门利用
在我们取得了 SPN 的修改权限后,可以为指定的域用户添加一个 SPN,这样可以随时获得该域用户的 TGS ,经过破解后获得明文口令。
0x08 参考
为报表服务器注册服务主体名称 (SPN)
KerberosRequestorSecurityToken(String)
从 Kekeo 到 Rubeus
域渗透——Kerberoasting